package com.itany;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Author：汤小洋
 * Date：2022-10-26 16:16
 * Description：<描述>
 */
public class Test11_终止操作 {
    public static void main(String[] args) {
        test3();
    }

    /**
     * 查找与匹配
     */
    public static void test1() {
        // 是否所有员工都在休假
        boolean allMatch = Emp.getTestDate().stream().allMatch(e -> {
            System.out.println(e);
            return State.VOCATION.equals(e.getState());
        });
        System.out.println(allMatch);
        System.out.println("----------------------------------------------------");

        // 是否员工处于忙碌状态
        boolean anyMatch = Emp.getTestDate().stream().anyMatch(e -> {
            System.out.println(e);
            return State.BUSY.equals(e.getState());
        });
        System.out.println(anyMatch);
        System.out.println("----------------------------------------------------");

        // 是否所有员工的年龄都不小于26
        boolean noneMatch = Emp.getTestDate().stream().noneMatch(e -> {
            System.out.println(e);
            return e.getAge() < 26;
        });
        System.out.println(noneMatch);
        System.out.println("----------------------------------------------------");

        // 取一个工资大于2000的员工
        // Optional<Emp> o = Emp.getTestDate().stream().filter(e -> e.getSalary() > 2000).findFirst();
        Optional<Emp> o = Emp.getTestDate().parallelStream().filter(e -> e.getSalary() > 2000).findAny();
        if (o.isPresent()) {
            Emp emp = o.get();
            System.out.println(emp);
        } else {
            System.out.println("不存在！");
        }
        System.out.println("----------------------------------------------------");

        // 工资大于 2000 的员工数量
        long count = Emp.getTestDate().parallelStream().filter(e -> e.getSalary() > 2000).count();
        System.out.println(count);
        System.out.println("----------------------------------------------------");

        // 工资最高的员工
        Optional<Emp> o1 = Emp.getTestDate().stream().max(Comparator.comparing(Emp::getSalary));
        System.out.println(o1);
        System.out.println("----------------------------------------------------");


    }

    /**
     * 归约
     */
    public static void test2() {
        Integer[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        // 计算数组中所有元素之和
        Integer n = 1000;
        Integer reduce = Arrays.stream(arr).reduce(n, (t, c) -> {
            System.out.println(t); // t表示上一次的累计结果
            System.out.println(c); // c表示本次的值
            System.out.println("----------------------");
            return t + c;
        });
        System.out.println(reduce);

    }

    /**
     * 收集
     */
    public static void test3(){
        // 收集所有员工的姓名
        List<String> collect = Emp.getTestDate().stream()
                .map(e -> e.getName())
                .collect(Collectors.toList());
        System.out.println(collect);
        System.out.println("----------------------");

        // 计算所有员工的工资总和
        Double sum = Emp.getTestDate().stream()
                // .collect(Collectors.summingDouble(Emp::getSalary));
                .collect(Collectors.averagingDouble(Emp::getSalary));
        System.out.println(sum);
        System.out.println("----------------------");

        // 所有员工数量
        Long count = Emp.getTestDate().stream()
                .collect(Collectors.counting());
        System.out.println(count);

    }

}
